home *** CD-ROM | disk | FTP | other *** search
/ Aminet 21 / Aminet 21 (1997)(GTI - Schatztruhe)[!][Oct 1997].iso / Aminet / comm / mail / YAMscripts.lha / Join.rexx < prev    next >
OS/2 REXX Batch file  |  1997-06-07  |  7KB  |  232 lines

  1. /*
  2. ** Join.rexx 1.2 - 01-Apr-97 by Kai.Nikulainen@utu.fi
  3. **
  4. ** Joins and uudecodes messages from ftp-mailservers.  The problem with this
  5. ** script is there are almost as many formats of messages as there are servers.
  6. ** So, if you are having problems with your server send me mail and I'll try
  7. ** to fix the problem.
  8. **
  9. ** This script only decodes uuencoded files now.  Base64 coding will be added
  10. ** if there are requests for it.  I have tested the script with following servers
  11. ** (which all have different message formats...)
  12. **  -mailserver@nic.funet.fi
  13. **  -mailserver@leo.org
  14. **  -ftp-mail@uni-paderborn.de
  15. **  -Anything mailed with SplitNMail.rexx should work
  16. **
  17. ** Send a message to any of the above addresses with word HELP in message body and
  18. ** you will receive instructions on how to use them.
  19. **
  20. ** Installation: 
  21. **  - Copy the script to yam:rexx
  22. **  - Check that variables tempfile, uudecode and del_temp have suitable values.
  23. **    Especially uudecode may need to be changed, depending on which uudecoder
  24. **    you are using.
  25. **
  26. ** Usage:
  27. **  - Just select a message and start the script.  The script will find all messages
  28. **    in the current folder from the same sender with almost the same subject, sort
  29. **    them and write the uucoded part to a file and then execute the uudecode command
  30. **  - If something goes wrong, check t:uu.log for a possible explanation.
  31. **
  32. ** Send all comments, bug reports, suggestions and X-mas cards to knikulai@utu.fi
  33. */
  34.  
  35. options results
  36. call addlib('rexxsupport.library',0,-30)
  37. call addlib('rexxreqtools.library',0,-30)
  38.  
  39.    tempfile='t:join.tmp'    /* All parts are joined to this file */
  40.    uudecode='c:uudecode >>t:uu.log' tempfile 'path work:home/'
  41.    del_temp='YES'    /* set to yes, if you want to delete the joined ASCII file */
  42.  
  43. startline.1='BEGIN -----'
  44.  stopline.1='END -----'
  45. startline.2='BEGIN PART'
  46.  stopline.2='END PART'
  47. startline.3='begin '
  48.  stopline.3='include '
  49. delimiters=3
  50.  
  51. title='Join.rexx'
  52. txt='Found the following files in this order:'
  53. buts='_Join them|_Quit'
  54.  
  55. mc=0 
  56. used=0
  57.  
  58. address 'YAM'
  59. 'GetMailInfo From'
  60. server=result
  61. 'GetMailInfo Subject'
  62. subj=result
  63. 'GetMailInfo Active'
  64. active=result
  65. 'GetFolderInfo Max'
  66. n=result
  67.  
  68. /* 
  69. ** First scan all messages in the folder.
  70. ** Search for messages with same sender and at most 4 different chars in subject 
  71. */
  72.  
  73. do m=0 to n-1
  74.     'SetMail' m
  75.     'GetMailInfo From'
  76.     if result=server then do
  77.        'GetMailInfo Subject'
  78.        if SubDiff(result,subj)<5 then call AddMsg(result)
  79.     end /* if result=server then do */
  80. end /* do m=1 to n */
  81. 'SetMail' active
  82. /*
  83. ** Then sort the messages.  Hopefully part 10 comes after 9 and not after 1....
  84. */
  85.  
  86. call SortMessages
  87.  
  88. do i=1 to mc
  89.     txt=txt || '0a'x || strip(left(subject.i,70))
  90.     end
  91. sel=rtezrequest(txt,buts,title,'rtez_defaultresponse=1')
  92. if sel=0 then exit
  93.  
  94. /*
  95. ** Lets write the messages into one file
  96. */
  97. if open(tmp,tempfile,'w') then do
  98.     do i=1 to mc
  99.         call open(1,filename.i,'r')
  100.     if findstart() then do
  101.         find_end=0
  102.         /* 
  103.         ** Next copy lines to tempfile until the end of file,
  104.         ** stopline is found or an empty line.  The last line is
  105.         ** not written to the tempfile.
  106.         */
  107.         do until find_end | eof(1) | rivi=''
  108.             rivi=readln(1)
  109.         find_end=pos(stopline.used,rivi)=1
  110.         if find_end=0 then call writeln(tmp,rivi)
  111.         end /* do until */
  112.         end /* if FindStart then */
  113.     else do 
  114.         /*
  115.         ** There should not be need to read every part twice, but I'm
  116.         ** supposing someone did the posting manually and the start
  117.         ** and stoplines were left out by mistake from some parts.
  118.         ** Reading the message avoids screwing things up if some
  119.         ** parts have delimiters and some doesn't.
  120.         */
  121.         call close(1) 
  122.         call open(1,filename.i,'r') /* Let's try again with better luck... */
  123.         rivi=readln(1)
  124.         /* Find first empty line */
  125.         do until rivi='' | eof(1) 
  126.             rivi=readln(1)
  127.         end
  128.         /* Find first non blank line */
  129.         do until rivi~='' | eof(1)
  130.                 rivi=readln(1)
  131.             end
  132.         /* Copy lines until the next blank line */
  133.         do until rivi='' | eof(1)
  134.             call writeln(tmp,rivi)
  135.                 rivi=readln(1)
  136.             end
  137.         end /* else */
  138.     call close(1)    
  139.         end /* do i=1 to mc */
  140.     end /* if open(*/
  141. else
  142.     'Request "Can not open' tempfile '" "_Ok"'
  143.  
  144. 'SetMail' active        /* Go back to the originally selected message */
  145. call writeln(tmp,'end')
  146. call close(tmp)            /* File must be closed before it can be read  */
  147. address command uudecode    /* Do some magic */
  148.  
  149. if upper(del_temp)='YES' then delete(tempfile)
  150.  
  151. address 'YAM' 'Request "  All done!  " "_Ok"'
  152. exit    /* It's the end of the script as we know it... */
  153.  
  154. FindStart:
  155.   found_it=0
  156.   if used=0 then do
  157.   /* 
  158.   ** When called the first time, this branch checks which delimiters are used 
  159.   ** Following calls use else branch
  160.   */
  161.      do until eof(1) | found_it
  162.          rivi=readln(1)
  163.          do d=1 to delimiters
  164.              if pos(startline.d,rivi)=1 then do
  165.               found_it=1
  166.               used=d
  167.           end /* if */
  168.               end /* do d=1 */
  169.          end /*do until */
  170.      if used=3 then call writeln(tmp,rivi)  /* Save uuencode first line */
  171.      end /* ifused=0 */
  172.   else do
  173.      do until eof(1) | found_it
  174.          rivi=readln(1)
  175.          found_it=pos(startline.used,rivi)
  176.          end /*do until */  
  177.      end /* else do */
  178. return found_it
  179.  
  180. SubDiff: procedure
  181.   /* Differences between strings are calculate by word */
  182.   parse arg s1,s2
  183.   diff=0
  184.   do i=1 to words(s1)
  185.     diff=diff+ChrDiff( word(s1,i) , word(s2,i) )
  186.   end
  187. return diff
  188.  
  189. ChrDiff: procedure
  190.   parse arg s1,s2
  191.   if length(s1)+1=length(s2) then s1='0's1
  192.   if length(s1)-1=length(s2) then s2='0's2
  193.   diff=abs(length(s1)-length(s2))
  194.   do i=1 to length(s1)
  195.     if substr(s1,i,1)~=substr(s2,i,1) then diff=diff+1
  196.   end
  197. return diff
  198.  
  199. AddMsg:
  200. /*
  201. ** This changes the subject's 'part n' to 'part 0n' to allow sorting
  202. */
  203.   parse arg s
  204.   mc=mc+1
  205.   l=pos('part ',s)
  206.   if l>0 then
  207.      subject.mc=left(s,l-1) || 'part 0' || substr(s,l+5)
  208.   else
  209.      subject.mc=s
  210.   'GetMailInfo File'
  211.   filename.mc=result
  212. return
  213.  
  214. SortMessages:
  215. /* 
  216. ** A simple algorithm is fastest with relatively few items.
  217. ** There should be no need for something fancy like quicksort :-) 
  218. */
  219.   do i=2 to mc
  220.      do j=1 to i-1
  221.         if subject.j>subject.i then do/* let's swap stuff... */
  222.         temp=subject.j
  223.         subject.j=subject.i
  224.         subject.i=temp
  225.         temp=filename.j
  226.         filename.j=filename.i
  227.         filename.i=temp
  228.         end /* if */
  229.      end /* do j */
  230.   end /* do i */
  231. return  /* Everything should be in order now... */
  232.